# This file is copied to ~/spec when you run 'ruby script/generate rspec'
# from the project root directory.
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'spec'
require 'spec/rails'

include AuthenticatedTestHelper    

Spec::Runner.configure do |config|
  # If you're not using ActiveRecord you should remove these
  # lines, delete config/database.yml and disable :active_record
  # in your config/boot.rb
  config.use_transactional_fixtures = true
  config.use_instantiated_fixtures  = false
  config.fixture_path = RAILS_ROOT + '/spec/fixtures/'

  # == Fixtures
  #
  # You can declare fixtures for each example_group like this:
  #   describe "...." do
  #     fixtures :table_a, :table_b
  #
  # Alternatively, if you prefer to declare them only once, you can
  # do so right here. Just uncomment the next line and replace the fixture
  # names with your fixtures.
  #
  # config.global_fixtures = :table_a, :table_b
  #
  # If you declare global fixtures, be aware that they will be declared
  # for all of your examples, even those that don't use them.
  #
  # == Mock Framework
  #
  # RSpec uses it's own mocking framework by default. If you prefer to
  # use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr
end
def login_as(usuario)
  request.session[:usuario] = usuario ? usuarios(usuario).id : nil
end 

class Hash
  # Usage { :a => 1, :b => 2, :c => 3}.except(:a) -> { :b => 2, :c => 3}
  def except(*keys)
    self.reject { |k,v|
      keys.include? k.to_sym
    }
  end

  # Usage { :a => 1, :b => 2, :c => 3}.only(:a) -> {:a => 1}
  def only(*keys)
    self.dup.reject { |k,v|
      !keys.include? k.to_sym
    }
  end
end

def spec_validate_presence_of(modelo, campos_validos = {}, base = false)
  before(:each) do
    @objeto = modelo.new
  end
  
  campos_validos.keys.each do |campo|  
    it "no debería ser valido sin #{campo}" do
      lambda {
        @objeto.attributes = campos_validos.except(campo)
        @objeto.save
        @objeto.should be_new_record
        if not base
          @objeto.should have_at_least(1).errors_on(campo)
        else
          @objeto.should have_at_least(1).errors
        end
      }.should_not change(modelo, :count)
    end
  end
  
  it "debería ser valido" do
    lambda {
      @objeto.attributes = campos_validos
      @objeto.save
      @objeto.should_not be_new_record      
    }.should change(modelo, :count).by(1)
  end
end  
